package model

import (
	"blog/app/common"
	"blog/app/utils"
	"log"
	"blog/app/entity"
)

type Tag struct {
	ID   uint64  `json:"id"`
	Name string `json:"name"`
}


// 查询所有标签
func (t *Tag) GetAll() []Tag {
	sql := "SELECT id,name from tag order by id desc"
	rows, err := common.DB.Query(sql)
	if utils.CheckErr(err) {
		return nil
	}
	var tags []Tag
	for rows.Next() {
		tag := Tag{}
		err := rows.Scan(&tag.ID, &tag.Name)
		if err != nil {
			log.Fatal(err)
		}
		tags = append(tags, tag)
	}
	rows.Close()
	return tags
}

// 查询所有标签 和 文章数量
func (t *Tag) GetTagStat() []entity.TagStat {
	sql := `SELECT t.id,t.name,COUNT(a.article_id) 
	       FROM tag t
	       LEFT JOIN article_tag a ON a.tag_id = t.id
	       GROUP BY t.id`
	rows, err := common.DB.Query(sql)
	if utils.CheckErr(err) {
		return nil
	}
	var tagStats []entity.TagStat
	for rows.Next() {
		tagStat := entity.TagStat{}
		err := rows.Scan(&tagStat.ID, &tagStat.Name,&tagStat.Number)
		if err != nil {
			log.Fatal(err)
		}
		tagStats = append(tagStats, tagStat)
	}
	rows.Close()
	return tagStats
}

func (t *Tag) Insert(name string) bool {
	sql := "insert into tag (name) value(?)"
	rs, err := common.DB.Exec(sql, name)
	if utils.CheckErr(err) {
		return false
	}
	_, err = rs.LastInsertId()
	if utils.CheckErr(err) {
		return false
	}
	return true
}

func (t *Tag) UpdateOne() bool {
	sql := "update tag set name=? where id=?"
	result, err := common.DB.Exec(sql, t.Name, t.ID)
	if utils.CheckErr(err) {
		return false
	}
	_, err = result.RowsAffected()
	if utils.CheckErr(err) {
		return false
	}
	return true
}

func (t *Tag) DeleteOne() bool {
	tx, err := common.DB.Begin() // 创建tx对象
	if utils.CheckErr(err) {
		return false
	}
	sql := "delete from tag where id=?"
	rs, err := tx.Exec(sql, t.ID)
	if utils.CheckErr(err) {
		tx.Rollback()
		return false
	}
	_, err = rs.RowsAffected()
	if utils.CheckErr(err) {
		tx.Rollback()
		return false
	}
	sql = "delete from article_tag where tag_id=?"
	rs, err = tx.Exec(sql, t.ID)
	if utils.CheckErr(err) {
		tx.Rollback()
		return false
	}
	_, err = rs.RowsAffected()
	if utils.CheckErr(err) {
		tx.Rollback()
		return false
	}
	err = tx.Commit()
	if utils.CheckErr(err) {
		tx.Rollback()
		return false
	}
	return true
}
